package GUI;

import com.sun.org.apache.bcel.internal.generic.RETURN;

import java.lang.String;

import java.sql.Connection;
import java.sql.PreparedStatement;

import libraries.LanguageLibrary;


public class BDErrorMsg implements InterErrorMsg {

    InterPacienteSave IPS = new BDPacienteSave();
    LanguageLibrary LL;


    public BDErrorMsg() {
    }


    public String unmask(String masked) {
        // ELIMINA LOS CARÁCTERES EXTRA DE LA MÁSCARA.
        // SE OBTIENE SÓLO LO INTRODUCIDO EN EL CAMPO POR EL USUARIO.

        if (masked == null || masked.trim().length() == 0) {
            return masked;
        }
        masked = masked.replaceAll("#", "");
        masked = masked.replaceAll("-", "");
        masked = masked.replaceAll("/", "");
        masked = masked.replaceAll(",", "");
        //masked = masked.replaceAll(".", "");    // EL PUNTO SUSTITUYE TODOS LOS CARÁCTERES
        masked = masked.replaceAll(" ", "");
        return masked;
    }

    public int NumCaracterX(String input, char caracterX) {
        // CUENTA EL Nº DE ALMOHADILLAS (#) QUE CONTIENE UN STRING.
        // SIRVE PARA SABER CUANTOS CARÁCTERES FALTAN POR INTRODUCIR.

        // DEFINICIÓN DE VARIABLES
        int contador = 0;

        // CONTADOR DE ALMOHADILLAS
        for (int i = 0; i < input.length(); 
             i++) { // RECORRE LOS DÍGITOS DEL INPUT
            if (input.charAt(i) == caracterX) {
                contador++; // CUENTA EL Nº DE CARÁCTERES SE HAN INTRODUCIDO EN EL JFormattedTextField
            }
        }
        return contador;
    }


    public int cuentaChar(String input, int long_min) {
        // SE INTRODUCE UN STRING Y UNA LONGITUD MÍNIMA DE CARÁCTERES.
        // DEVUELVE CUÁNTOS CARÁCTERES FALTAN PARA ALCANZAR EL MÍNIMO.
        // DESECHA LOS CARÁCTERES QUE NO SON ALFANUMÉRICOS

        // DEFINICIÓN DE VARIABLES
        int contador = 0;
        int diferencia;

        for (int i = 0; i < input.length(); 
             i++) { // RECORRE LOS DÍGITOS DEL INPUT
            if (input.charAt(i) >= 'a' && input.charAt(i) <= 'z' || 
                input.charAt(i) >= 'A' && input.charAt(i) <= 'Z' || 
                input.charAt(i) >= '0' && input.charAt(i) <= '9')
                contador++; // CUENTA EL Nº DE CARÁCTERES SE HAN INTRODUCIDO EN EL JFormattedTextField
        }
        //CÁLCULO DE DIFERENCIA DE LONGITUDES
        diferencia = input.length() - long_min;
        if (diferencia == 1) {
            diferencia = 0;
        }
        return diferencia;
    }

    public int errorDNI(String DNIconMascara, String LetraNIE) {

        // Definición de variables
        int errorDNI;
        String DNIcorrecto;
        // Filtrado de los datos recogidos        
        String DNIsinMascara = 
            this.unmask(DNIconMascara); // ELIMINA LOS CARÁCTERES DE MÁSCARA DEL DNI / NIE. QUEDAN 8 DÍGITOS + LETRA.

        int longitudMsg = this.cuentaChar(DNIsinMascara, 9); // MUESTRA EL NÚMERO DE CARÁCTERES VÁLIDOS QUE FALTAN PARA COMPLETAR EL CAMPO
        // CUADRO DE TEXTO VACÍO
        if (DNIsinMascara.length() == 0) {
            errorDNI = 2;
        }
        else if (longitudMsg == 0) { // MÁSCARA COMPLETA
            boolean msgNIF = 
                this.isDNI(DNIsinMascara); // LEE EL DNI / NIE INTRODUCIDO Y COMPRUEBA SI LA LETRA ES CORRECTA

            if (msgNIF == true) { // NUMERO DE DNI/ NIF VALIDADO CON LA LETRA

                if (DNIconMascara.charAt(0) == '0') { // SE TRATA DE UN NIE

                    if (LetraNIE.charAt(0) != 
                        ' ') { // EL NIE VA ACOMPAÑADO POR SU LETRA CORRESPONDIENTE
                        // *** GUARDA EL NIE EN LA BASE DE DATOS ***   
                        DNIcorrecto = 
                                DNIsinMascara.substring(1, DNIsinMascara.length()); // FILTRA EL CERO INICIAL DEL NIE
                        DNIcorrecto = 
                                LetraNIE.substring(0, 1).concat(DNIcorrecto); // AÑADE LA LETRA AL NIE
                        System.out.println("DNIsave: " + DNIcorrecto);
                        IPS.Set("DNI", 
                                DNIcorrecto); // GUARDA EL ÚLTIMO VALOR CORRECTO EN LA BASE DE DATOS
                        System.out.println("DNI saved in BD: " + DNIcorrecto);
                        errorDNI = 0;
                    } else {
                        errorDNI = 5; // FALTA LA LETRA DEL NIE
                    }
                } else { // SE TRATA DE UN DNI
                    if (LetraNIE.charAt(0) != 
                        ' ') { // HAY LETRA DE NIE PERO ES UN NÚMERO DE DNI --> SE ELIMINA LA LETRA
                        errorDNI = 6; // SOBRA LA LETRA DEL NIE
                    } else {
                        // *** GUARDA EL DNI EN LA BASE DE DATOS ***
                        DNIcorrecto = DNIsinMascara;
                        System.out.println("DNI saved in BD: " + DNIcorrecto);
                        IPS.Set("DNI", 
                                DNIcorrecto); // GUARDA EL ÚLTIMO VALOR CORRECTO EN LA BASE DE DATOS
                        errorDNI = 1;
                    }
                }
            } else { // Nº DNI / NIE INCORRECTO
                errorDNI = 4;
            }
        }
        else { // MÁSCARA INCOMPLETA: Faltan Carácteres.
            errorDNI = 3;
        }
        return errorDNI;
    }

    public boolean isDNI(String input) {

        // SE INICIALIZAN LAS VARIABLES       
        boolean MsgNIF = false;
        char letraNIF;
        char letraResult;
        String tempNIF; // SACA UNO A UNO LOS CARÁCTERES DEL NIF
        int numNIF;
        String cadena = 
            "TRWAGMYFPDXBNJZSQVHLCKET"; // LISTA CARÁCTERES PARA ESCOGER LA LETRA DEL NIF

        // CÓDIGO DE OBTENCIÓN DE LA LETRA DEL NIF / DNI
        letraNIF = 
                input.charAt(8); // SACA LA LETRA DEL DNI INTRODUCIDO        
        tempNIF = 
                input.substring(0, 8); // RECORTA EL STRING DEJANDO SÓLO LOS NÚMEROS DEL NIF (QUITA LA LETRA)
        numNIF = Integer.parseInt(tempNIF); //        
        int posicion = 
            numNIF % 23; // DIVIDE POR 23 EL NÚMERO DEL NIF / DNI PARA SACAR LA POSICIÓN EN LA QUE SE ENCUENTRA LA LETRA
        letraResult = 
                cadena.substring(posicion, posicion + 1).charAt(0); // BUSCA LA LETRA EN LA POSICIÓN OBTENIDA, EN LA LISTA DE LETRAS
        //System.out.println("INPUT"+input);
        //System.out.println("LetraResult: "+letraResult);        

        // COMPARA LA LETRA INTRODUCIDA CON LA OBTENIDA Y SACA EL MENSAJE DE ERROR PARA CADA CASO
        if (letraNIF == letraResult) {
            MsgNIF = true;
        } else {
            MsgNIF = false;
        }
        return MsgNIF;
    }

    public int isMail(String mail) {
        /* SE INTRODUCE UN STRING. 
         * IDENTIFICA SI SE TRATA O NO DE UN EMAIL CORRECTO. CÓDIGO DE ERRORES:
         * isMail = 0 --> EMAIL CORRECTO        
         * isMail = 1 --> CAMPO E-MAIL VACÍO
         * isMail = 2 --> AUSENCIA DE ARROBAS         
         * isMail = 3 --> DIRECCIÓN E-MAIL SIN PUNTOS (E-MAIL SIN DOMINIO)
         * isMail = 4 --> NºARROBAS EXCESIVO (>1)
         * isMail = 5 --> CARÁCTER INVÁLIDO
         * isMail = 6 --> DOBLE PUNTO               
         * isMail = 7 --> NO EXISTE PUNTO DESPUÉS DE LA ARROBA
         * isMail = 8 --> DETECTA LONGITUDES INCORRECTAS EN LOS CAMPOS DEL EMAIL        
         * isMail = 9 --> DETECTA CARÁCTERES EN POSICIONES INCORRECTAS
         */ 

        // DEFINICIÓN DE VARIABLES
        int posicionArroba = 0;
        int posicionPunto = 0;
        int isMail = 0;

        int NumArrobas = this.NumCaracterX(mail, '@');
        //System.out.println("Nºarrobas:... "+Nºarrobas);
        int NumPuntos = this.NumCaracterX(mail, '.');
        //System.out.println("Nºpuntos:... "+Nºpuntos);

        try {
            Exception err = 
                new Exception(); // DEFINE LA EXCEPCIÓN QUE SE LANZARÁ CUANDO SE DETECTE UN ERROR

            // ERR 1: CAMPO DEL E-MAIL VACÍO
            if(mail.length() == 0){
                isMail = 1;
                throw (err);
            }      
            
            // ERR 2: AUSENCIA DE ARROBAS
            if (NumArrobas == 0 ) {
                isMail = 2;
                throw (err);
            }
            
            // ERR 3: DIRECCIÓN E-MAIL SIN PUNTOS (E-MAIL SIN DOMINIO)
            if (NumPuntos == 0) {
                isMail = 3;
                throw (err);
            }
            
            // ERR 4: NUMERO DE ARROBAS EXCESIVO
            if (NumArrobas > 1 ) {
                isMail = 4;
                throw (err);
            }
    
            // ERR 5: DETECTA LA EXISTENCIA DE CARÁCTERES INVÁLIDOS
            for (int i = 0; i < mail.length(); i++) { // RECORRE LOS DÍGITOS DEL INPUT
                if (mail.charAt(i) == 'ñ' || mail.charAt(i) == '&' ||
                    mail.charAt(i) == '*' || mail.charAt(i) == '+' || 
                    mail.charAt(i) == '/' || mail.charAt(i) == '%' || 
                    mail.charAt(i) == '$') {
                    isMail = 5;
                    throw (err);
                }
            }
    
            // DETECTA LA POSICIÓN DE LA ARROBA EN EL MAIL. EL ÚLTIMO ARROBA DEL STRING
            for (int i = 0; i < mail.length(); i++) { // RECORRE LOS DÍGITOS DEL INPUT
                if (mail.charAt(i) == '@') {
                    posicionArroba = i + 1;
                }
            }
                
            // ERR 6: DETECTA DOBLE PUNTO. ADEMÁS...
            // DETECTA LA POSICIÓN DEL PUNTO DE DOMINIO EN EL MAIL, O EL ÚLTIMO PUNTO DEL STRING
            for (int i = 0; i < mail.length(); i++) { // RECORRE LOS DÍGITOS DEL INPUT
                if (mail.charAt(i) == '.') {
                    posicionPunto = i + 1;
                    if (mail.length() > posicionPunto) {
                        if (mail.charAt(i + 1) == '.') {
                            isMail = 6; // HAY DOS PUNTOS SEGUIDOS: Mail incorrecto
                            throw (err);
                        }
                    }
                }
            }
    
            // ERR 7: NO EXISTE PUNTO DESPUÉS DE LA ARROBA
            if (posicionArroba > posicionPunto) {
                isMail = 7;
                throw (err);
            }
    
            // DISECCIONA LOS COMPONENTES DEL E-MAIL
            String cabeceraMail = mail.substring(0, posicionArroba - 1);
            String subDominio = mail.substring(posicionArroba, posicionPunto - 1);
            String dominio = mail.substring(posicionPunto, mail.length());
    
            /*System.out.println("posicionArroba: "+posicionArroba);
            System.out.println("posicionPunto: "+posicionPunto);
            System.out.println("cabeceraMail: "+cabeceraMail);
            System.out.println("subDominio: "+subDominio);
            System.out.println("dominio: "+dominio);*/
    
            // ERR 8: DETECTA LONGITUDES INCORRECTAS EN LOS CAMPOS DEL EMAIL
            if (cabeceraMail.length() == 0 || subDominio.length() == 0 || 
                dominio.length() < 2 || dominio.length() >= 5) {
                isMail = 8;
                throw (err);
            }
    
            // ERR 9: DETECTA CARÁCTERES EN POSICIONES INCORRECTAS
            char preArroba = mail.charAt(posicionArroba - 2);
            if (preArroba == ' ' || preArroba == '.' || 
                mail.charAt(0) == '.') {
                isMail = 9; // EXISTEN CARÁCTERES EN POSICIONES INCORRECTAS.
                throw (err);
            }
            
        } catch (Exception err) {
            System.out.println("Error detectado en el Mail: " + isMail);

        }
        return isMail;
    }

    public int NumeroCaracterX(String input, char caracterX) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}


